package gov.pr.celepar.sentinela.admin.action;

import gov.pr.celepar.sentinela.admin.dao.SistemaDAO;
import gov.pr.celepar.sentinela.admin.dao.factory.DAOFactoryServer;
import gov.pr.celepar.sentinela.admin.excecao.SentinelaServerException;
import gov.pr.celepar.sentinela.admin.form.BloqueioGrupoForm;
import gov.pr.celepar.sentinela.admin.pojo.Grupo;
import gov.pr.celepar.sentinela.admin.pojo.GrupoSistema;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;

public class BloqueioGrupoAction extends BaseAction {
	private static Log logger = LogFactory.getLog(BloqueioGrupoAction.class);

	public String executar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws SentinelaServerException, Exception {

		listarSistemasAutorizados(request);
		BloqueioGrupoForm bloqueioGrupoForm = (BloqueioGrupoForm) form;

		if (this.CONF_ALTERAR.equalsIgnoreCase(bloqueioGrupoForm.getAcao())) {
			this.comunicacao.autorizaOperacao('A', request, response);
			consultar(bloqueioGrupoForm, request);
			alterar(bloqueioGrupoForm, request);
		}
		if (bloqueioGrupoForm.getCodSistema() != null
				&& !bloqueioGrupoForm.getCodSistema().equals(""))
			consultar(bloqueioGrupoForm, request);
		return "lista_grupoSistemaBloqueados";
	}

	private void alterar(BloqueioGrupoForm form, HttpServletRequest request)
			throws SentinelaServerException {

		DAOFactoryServer daoFactory = DAOFactoryServer.getDAOFactory();
		SistemaDAO sistemaB = daoFactory.getSistemaDAO();

		String codGruposBloqueados[] = form.getCodGruposBloqueados();
		String codGruposNaoBloaqueados[] = form.getCodGruposNaoBloqueados();

		Collection bloqueados = (Collection) request
				.getAttribute("listaGruposBloqueados");
		Collection naoBloqueados = (Collection) request
				.getAttribute("listaGruposNaoBloqueados");

		long bloqueadosForm[] = null;
		long naoBloqueadosForm[] = null;
		long bloqueadosBanco[] = null;
		long naoBloqueadosBanco[] = null;

		if (codGruposBloqueados != null) {
			bloqueadosForm = new long[codGruposBloqueados.length];
			for (int i = 0; i < codGruposBloqueados.length; i++) {
				try {
					bloqueadosForm[i] = Long.parseLong(codGruposBloqueados[i]);
				} catch (NumberFormatException e) {
					logger.error("", e);
				}
			}
		} else {
			bloqueadosForm = new long[0];
		}

		if (codGruposNaoBloaqueados != null) {
			naoBloqueadosForm = new long[codGruposNaoBloaqueados.length];
			for (int i = 0; i < codGruposNaoBloaqueados.length; i++) {
				try {
					naoBloqueadosForm[i] = Integer
							.parseInt(codGruposNaoBloaqueados[i]);
				} catch (NumberFormatException e) {
					logger.error("", e);
				}
			}
		} else {
			naoBloqueadosForm = new long[0];
		}

		if (bloqueados != null) {
			bloqueadosBanco = new long[bloqueados.size()];
			Iterator it = bloqueados.iterator();
			int i = 0;
			while (it.hasNext())
				bloqueadosBanco[i++] = ((Grupo) it.next()).getCodGrupo();
		} else {
			bloqueadosBanco = new long[0];
		}

		if (naoBloqueados != null) {
			naoBloqueadosBanco = new long[naoBloqueados.size()];
			Iterator it = naoBloqueados.iterator();
			int i = 0;
			while (it.hasNext())
				naoBloqueadosBanco[i++] = ((Grupo) it.next()).getCodGrupo();
		} else {
			naoBloqueadosBanco = new long[0];
		}

		for (int i = 0; i < bloqueadosBanco.length; i++) {
			boolean encontrou = false;
			for (int j = 0; j < bloqueadosForm.length; j++) {
				if (bloqueadosBanco[i] == bloqueadosForm[j]) {
					encontrou = true;
					break;
				}
			}
			if (!encontrou) {
				logger.debug("Desbloquear grupo ..." + bloqueadosBanco[i]);
				GrupoSistema gs = new GrupoSistema();
				gs.setCodSistema(Long.decode(form.getCodSistema()));
				try {
					gs.setCodGrupo(bloqueadosBanco[i]);
					sistemaB.desbloquearGrupo(gs);
				} catch (SentinelaServerException e) {
					throw e;
				} catch (Exception e) {
					throw new SentinelaServerException(
							"Erro ao Desbloquear grupo do Sistema!", e);
				}
			}
		}

		for (int i = 0; i < bloqueadosForm.length; i++) {
			boolean encontrou = false;
			for (int j = 0; j < bloqueadosBanco.length; j++) {
				if (bloqueadosForm[i] == bloqueadosBanco[j]) {
					encontrou = true;
					break;
				}
			}
			if (!encontrou) {
				logger.debug("Bloquear grupo ..." + bloqueadosForm[i]);
				GrupoSistema gs = new GrupoSistema();
				gs.setCodSistema(Long.decode(form.getCodSistema()));
				try {
					gs.setCodGrupo(bloqueadosForm[i]);
					sistemaB.bloquearGrupo(gs);
				} catch (SentinelaServerException e) {
					throw e;
				} catch (Exception e) {
					throw new SentinelaServerException(
							"Erro ao Bloquear grupo ao Sistema!", e);
				}
			}
		}
	}

	private void consultar(BloqueioGrupoForm form, HttpServletRequest request)
			throws SentinelaServerException {
		Collection listaBloqueados;
		Collection listaNaoBloqueados;
		DAOFactoryServer daoFactory = DAOFactoryServer.getDAOFactory();
		SistemaDAO sistemaB = daoFactory.getSistemaDAO();

		try {
			// get GruposBloqueados
			listaBloqueados = sistemaB.getGruposBloqueados(Long.decode(form
					.getCodSistema()));
			Iterator i = listaBloqueados.iterator();
			ArrayList<Grupo> bloqueados = new ArrayList<Grupo>();

			while (i.hasNext()) {
				Grupo grupo = (Grupo) i.next();
				bloqueados.add(grupo);
			}
			request.setAttribute("listaGruposBloqueados", bloqueados);
		} catch (SentinelaServerException e) {
			throw e;
		} catch (Exception e) {
			throw new SentinelaServerException(
					"Erro ao Recuperar Grupos bloqueados do Sistema!", e);
		}

		// get GruposNaoBloqueados
		try {
			listaNaoBloqueados = sistemaB.getGruposNaoBloqueados(Long
					.decode(form.getCodSistema()));
			Iterator i = listaNaoBloqueados.iterator();
			ArrayList<Grupo> naoBloqueados = new ArrayList<Grupo>();

			while (i.hasNext()) {
				Grupo grupo = (Grupo) i.next();
				naoBloqueados.add(grupo);
			}
			request.setAttribute("listaGruposNaoBloqueados", naoBloqueados);
		} catch (SentinelaServerException e) {
			throw e;
		} catch (Exception e) {
			throw new SentinelaServerException(
					"Erro ao Recuperar Grupos não bloqueados do Sistema!", e);
		}
	}
}
